#include <stdlib.h>

#include "SDL/SDL.h"

#include "saisie_clavier_sdl.h"

#include "constantes_et_macros.h"




/**
 * \fn static void set_champ_saisie(char* champ, const char booleen,
                                    const char direction, const char id_champ)
 * \brief Regle le champ donne avec direction si booleen
 *        est VRAI, le met a NEUTRE sinon
 *
 * \param[out] champ L'adresse du champ a regler
 * \param[in] booleen VRAI ou FAUX
 * \param[in] direction HAUT, ..., GAUCHE
 * \param[in] id_champ DEPLACEMENT ou DIRECTION_TIR. Indique la nature de la donnee a modifier
 */
static void set_champ_saisie(char* champ, const char booleen,
                             const char direction, const char id_champ)
{
    Uint8* touches;

    if(booleen)
        *champ = direction;
    else
    {
        touches = SDL_GetKeyState(NULL);
        *champ = NEUTRE;
        /*
         * pour le deplacement, il convient de regarder si le joueur appuyait
         * sur deux touches a la fois. Il ne faut alors pas le
         * mettre en NEUTRE, mais le faire aller dans la direction
         * correspondant a l'autre touche qui est enfoncee
         */
        if(id_champ == DEPLACEMENT)
        {
            if(touches[SDLK_UP])
                *champ = HAUT;
            if(touches[SDLK_RIGHT])
                *champ = DROITE;
            if(touches[SDLK_DOWN])
                *champ = BAS;
            if(touches[SDLK_LEFT])
                *champ = GAUCHE;
        }
    }
}



void set_saisie_sdl(struct resume_saisie* resume, const SDLKey touche,
                    const char booleen)
{
    switch(touche)
    {
        case SDLK_UP:
            set_champ_saisie(&resume->orientation, booleen, HAUT, DEPLACEMENT);
            break;
        case SDLK_RIGHT:
            set_champ_saisie(&resume->orientation, booleen, DROITE, DEPLACEMENT);
            break;
        case SDLK_DOWN:
            set_champ_saisie(&resume->orientation, booleen, BAS, DEPLACEMENT);
            break;
        case SDLK_LEFT:
            set_champ_saisie(&resume->orientation, booleen, GAUCHE, DEPLACEMENT);
            break;
        case SDLK_z:
            set_champ_saisie(&resume->direction_tir, booleen, HAUT, DIRECTION_TIR);
            break;
        case SDLK_d:
            set_champ_saisie(&resume->direction_tir, booleen, DROITE, DIRECTION_TIR);
            break;
        case SDLK_s:
            set_champ_saisie(&resume->direction_tir, booleen, BAS, DIRECTION_TIR);
            break;
        case SDLK_q:
            set_champ_saisie(&resume->direction_tir, booleen, GAUCHE, DIRECTION_TIR);
            break;
        case SDLK_ESCAPE:
            resume->quitte = booleen;
            break;
        case SDLK_F1:
            if(booleen)
                resume->utilisation_objet = 1;
            break;
        case SDLK_F2:
            if(booleen)
                resume->utilisation_objet = 2;
            break;
        case SDLK_F3:
            if(booleen)
                resume->utilisation_objet = 3;
            break;
        case SDLK_RETURN:
            resume->entree = booleen;
        default:
            break;
    }
}



void saisir_sdl(struct resume_saisie* resume)
{
    SDL_Event evenement;

    while(SDL_PollEvent(&evenement))
    {
        switch(evenement.type)
        {
            case SDL_KEYDOWN:
                /* touche pressee ! */
                set_saisie_sdl(resume, evenement.key.keysym.sym, VRAI);
                break;
            case SDL_KEYUP:
                /* touche relachee ! */
                set_saisie_sdl(resume, evenement.key.keysym.sym, FAUX);
                break;
            case SDL_QUIT:
                resume->quitte = VRAI;
                break;
            default:
                break;
        }
    }
}



void souris_echap_sdl(struct resume_souris_echap* resume)
{
    SDL_Event evenement;

    while(SDL_PollEvent(&evenement))
    {
        switch(evenement.type)
        {
            case SDL_MOUSEMOTION:
                resume->x_souris = evenement.motion.x;
                resume->y_souris = evenement.motion.y;
                break;
            case SDL_MOUSEBUTTONDOWN:
                if(evenement.button.button == SDL_BUTTON_LEFT)
                    resume->clique = VRAI;
                break;
            case SDL_KEYDOWN:
                if(evenement.key.keysym.sym == SDLK_ESCAPE)
                    resume->echap = VRAI;
            default:
                break;
        }
    }
}


